{
  lib,
  stdenv,
  nukeReferences,
  langC,
  langCC,
  runtimeShell,
}:

let
  enableChecksum =
    (
      with stdenv;
      lib.systems.equals buildPlatform hostPlatform && lib.systems.equals hostPlatform targetPlatform
    )
    && langC
    && langCC
    && !stdenv.hostPlatform.isDarwin;
in
(
  pkg:
  pkg.overrideAttrs (
    previousAttrs:
    lib.optionalAttrs enableChecksum {
      outputs = previousAttrs.outputs ++ lib.optionals enableChecksum [ "checksum" ];
      # This is a separate phase because gcc assembles its phase scripts
      # in bash instead of nix (we should fix that).
      preFixupPhases = (previousAttrs.preFixupPhases or [ ]) ++ [ "postInstallSaveChecksumPhase" ];
      #
      # gcc uses an auxiliary utility `genchecksum` to md5-hash (most of) its
      # `.o` and `.a` files prior to linking (in case the linker is
      # nondeterministic).  Since we want to compare across gccs built from two
      # separate derivations, we wrap `genchecksum` with a `nuke-references`
      # call.  We also stash copies of the inputs to `genchecksum` in
      # `$checksum/inputs/` -- this is extremely helpful for debugging since
      # it's hard to get Nix to not delete the $NIX_BUILD_TOP of a successful
      # build.
      #
      postInstallSaveChecksumPhase = ''
        mv gcc/build/genchecksum gcc/build/.genchecksum-wrapped
        cat > gcc/build/genchecksum <<\EOF
        #!${runtimeShell}
        ${nukeReferences}/bin/nuke-refs $@
        for INPUT in "$@"; do install -Dt $INPUT $checksum/inputs/; done
        exec build/.genchecksum-wrapped $@
        EOF
        chmod +x gcc/build/genchecksum
        rm gcc/*-checksum.*
        make -C gcc cc1-checksum.o cc1plus-checksum.o
        install -Dt $checksum/checksums/ gcc/cc*-checksum.o
      '';
    }
  )
)
